iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0

底層運行流程

C# 編譯器流程

  • 語法與重載解析
    編譯器(Roslyn)看到 Console.WriteLine("Hello .NET"),會解析為對 System.Console.WriteLine(string) 的靜態方法呼叫。

  • 字串字面量與駐留(Interning)
    "Hello .NET" 會被存入組件的「使用者字串堆」(#US heap)。
    執行時透過字串駐留池(intern pool),確保相同內容的字面量共用同一個物件實例(節省記憶體)。

  • 生成 IL(中間語言)
    Roslyn 會將這行程式碼編譯成類似以下的 IL 指令:

    ldstr "Hello .NET"     // 載入字串字面量為托管字串參考
    call void [System.Console]System.Console::WriteLine(string)
    ret
    

    完整的 Main 方法 IL 如下:

    .method private hidebysig static void Main(string[] args) cil managed
    {
        .entrypoint
        ldstr "Hello .NET"
        call void [System.Console]System.Console::WriteLine(string)
        ret
    }
    

.NET 執行時期(CLR/JIT 層面)

  • 程式載入與型別解析
    CLR 載入你的組件,並解析 System.Console 類別與其 WriteLine 方法實作(位於執行時期函式庫,如 System.Console.dll)。

  • JIT 編譯
    首次呼叫 WriteLine 時,JIT 會將對應方法體編譯為目前平台的原生機器碼。

  • 靜態呼叫
    因為 WriteLine 是靜態方法,IL 使用 call 指令(非虛擬呼叫)。


類別庫層面(BCL):字串如何寫入主控台

  • Console.Out
    Console.WriteLine 實際寫入的是 Console.Out(一個 TextWriter)。預設包裝一個 StreamWriter,底層連接到標準輸出流(stdout)。

  • 緩衝與自動刷新
    Console.Out 預設為同步(線程安全包裝),且 AutoFlush = true(遇到換行符自動刷新緩衝區)。
    WriteLine 寫完內容後會附加換行符並刷新(適合人機互動,但吞吐量不如批次寫入)。

  • 換行符
    WriteLine 附加的是 Environment.NewLine

    • Windows:"\r\n"
    • Linux/macOS:"\n"
  • 線程安全
    Console.Out 預設經 TextWriter.Synchronized 包裝,可避免多執行緒下同一行文字交錯,但不保證跨多個 Write/WriteLine 呼叫的原子性。


作業系統與終端層面

  • 終端顯示或重導向
    若未重導向,輸出會顯示在終端視窗(如 Windows Terminal、cmd、bash/zsh 等)。
    若重導向(Console.IsOutputRedirected == true),資料會寫入管道或檔案,而非螢幕。

  • 編碼轉換
    Console 使用 Console.OutputEncoding,決定如何將 .NET 內部的 UTF-16 字串編碼為位元組寫出。

  • 系統呼叫

    • Windows:常用 WriteConsoleWWriteFile 等 API
    • Linux/macOS:透過 write(2) 寫入檔案描述符 1(stdout)

上一篇
快速開始
下一篇
「單 cs run 模式」底層原理跟開源程式碼由來
系列文
新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言